﻿Функция ПолучитьДату()
	
	Возврат КонецДня(ТекущаяДата()) + 1;
	
КонецФункции	

Функция ПолучитьАктуальноеМеню()
	
	Результат = Неопределено;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Меню.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.Меню КАК Меню
	|ГДЕ
	|	Меню.Дата = &Дата";
	Запрос.УстановитьПараметр("Дата", ПолучитьДату());
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	Если РезультатЗапроса.Количество() > 0 Тогда
		Результат = РезультатЗапроса.Получить(0)["Ссылка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьПользователя(Токен) Экспорт
	
	Возврат Справочники.Пользователи.НайтиПоРеквизиту("Токен", Токен);
	
КонецФункции

Функция ПолучитьЗаказПользователя(Пользователь)
	
	Результат = Неопределено;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ЗаказПользователя.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ЗаказПользователя КАК ЗаказПользователя
	|ГДЕ
	|	ЗаказПользователя.Пользователь = &Пользователь
	|	И ЗаказПользователя.Дата = &Дата";
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Дата", ПолучитьДату());
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	Если РезультатЗапроса.Количество() > 0 Тогда
		Результат = РезультатЗапроса.Получить(0)["Ссылка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьСоставКорзиныДляЗаказа(Пользователь)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	КорзиныПользователей.Блюдо КАК Блюдо,
	|	КорзиныПользователей.Количество КАК Количество
	|ИЗ
	|	РегистрСведений.КорзиныПользователей КАК КорзиныПользователей
	|ГДЕ
	|	КорзиныПользователей.Пользователь = &Пользователь
	|	И КорзиныПользователей.Дата = &Дата";
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Дата", ПолучитьДату());
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	
	Результат["Успех"] = Истина;
	Результат["Результат"] = РезультатЗапроса;
	
	Возврат Результат;
	
КонецФункции


Функция ПолучитьМеню(Дата, Токен = Неопределено) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Попытка
		Если Не Токен = Неопределено Тогда
			Пользователь = ПолучитьПользователя(Токен);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Пользователь) Тогда
			Запрос = Новый Запрос;
			Запрос.Текст =
			"ВЫБРАТЬ
			|	ПользователиАллергены.Аллерген КАК Аллерген
			|ПОМЕСТИТЬ ВТ_АллергеныПользователя
			|ИЗ
			|	Справочник.Пользователи.Аллергены КАК ПользователиАллергены
			|ГДЕ
			|	ПользователиАллергены.Ссылка = &Пользователь
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ПользователиВитамины.Витамин КАК Витамин
			|ПОМЕСТИТЬ ВТ_ВитаминыПользователя
			|ИЗ
			|	Справочник.Пользователи.Витамины КАК ПользователиВитамины
			|ГДЕ
			|	ПользователиВитамины.Ссылка = &Пользователь
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ПользователиДиетическиеСтолы.ДиетическийСтол КАК ДиетическийСтол
			|ПОМЕСТИТЬ ВТ_ДиетическиеСтолыПользователя
			|ИЗ
			|	Справочник.Пользователи.ДиетическиеСтолы КАК ПользователиДиетическиеСтолы
			|ГДЕ
			|	ПользователиДиетическиеСтолы.Ссылка = &Пользователь
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	МенюБлюда.Блюдо.Наименование КАК dishname,
			|	МенюБлюда.Блюдо.Выход КАК amount,
			|	МенюБлюда.Блюдо.ЕдиницаИзмерения.Наименование КАК unit,
			|	МенюБлюда.Цена КАК price,
			|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(МенюБлюда.Блюдо) КАК id,
			|	МенюБлюда.Блюдо.Изображение КАК Изображение,
			|	МенюБлюда.Блюдо КАК Блюдо
			|ПОМЕСТИТЬ ВТ_БлюдаМеню
			|ИЗ
			|	Документ.Меню.Блюда КАК МенюБлюда
			|ГДЕ
			|	НАЧАЛОПЕРИОДА(МенюБлюда.Ссылка.Дата, ДЕНЬ) = &Дата
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ВТ_БлюдаМеню.Блюдо КАК Блюдо,
			|	ВТ_АллергеныПользователя.Аллерген КАК Аллерген
			|ИЗ
			|	ВТ_БлюдаМеню КАК ВТ_БлюдаМеню
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Блюда.СоставБлюда КАК БлюдаСоставБлюда
			|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ингредиенты.Аллергены КАК ИнгредиентыАллергены
			|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_АллергеныПользователя КАК ВТ_АллергеныПользователя
			|				ПО ИнгредиентыАллергены.Аллерген = ВТ_АллергеныПользователя.Аллерген
			|			ПО БлюдаСоставБлюда.Ингредиент = ИнгредиентыАллергены.Ссылка
			|		ПО ВТ_БлюдаМеню.Блюдо = БлюдаСоставБлюда.Ссылка
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ВТ_БлюдаМеню.Блюдо КАК Блюдо,
			|	ВТ_ВитаминыПользователя.Витамин КАК Витамин
			|ИЗ
			|	ВТ_БлюдаМеню КАК ВТ_БлюдаМеню
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Блюда.СоставБлюда КАК БлюдаСоставБлюда
			|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ингредиенты.Витамины КАК ИнгредиентыВитамины
			|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ВитаминыПользователя КАК ВТ_ВитаминыПользователя
			|				ПО ИнгредиентыВитамины.Витамин = ВТ_ВитаминыПользователя.Витамин
			|			ПО БлюдаСоставБлюда.Ингредиент = ИнгредиентыВитамины.Ссылка
			|		ПО ВТ_БлюдаМеню.Блюдо = БлюдаСоставБлюда.Ссылка
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ВТ_БлюдаМеню.Блюдо КАК Блюдо,
			|	ВТ_ДиетическиеСтолыПользователя.ДиетическийСтол КАК ДиетическийСтол
			|ИЗ
			|	ВТ_БлюдаМеню КАК ВТ_БлюдаМеню
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДиетическиеСтолыПользователя КАК ВТ_ДиетическиеСтолыПользователя
			|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Блюда.ДиетическиеСтолы КАК БлюдаДиетическиеСтолы
			|			ПО (БлюдаДиетическиеСтолы.ДиетическийСтол = ВТ_ДиетическиеСтолыПользователя.ДиетическийСтол)
			|		ПО (ВТ_БлюдаМеню.Блюдо = БлюдаДиетическиеСтолы.Ссылка)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ВТ_БлюдаМеню.dishname КАК dishname,
			|	ВТ_БлюдаМеню.amount КАК amount,
			|	ВТ_БлюдаМеню.unit КАК unit,
			|	ВТ_БлюдаМеню.price КАК price,
			|	ВТ_БлюдаМеню.id КАК id,
			|	ВТ_БлюдаМеню.Изображение КАК Изображение,
			|	ВТ_БлюдаМеню.Блюдо КАК Блюдо
			|ИЗ
			|	ВТ_БлюдаМеню КАК ВТ_БлюдаМеню";
			Запрос.УстановитьПараметр("Пользователь", Пользователь);
			Запрос.УстановитьПараметр("Дата", ПолучитьДату());
			
			РезультатЗапроса = Запрос.ВыполнитьПакет();
			
			АллергеныБлюд = РезультатЗапроса.Получить(4).Выгрузить();
			ВитаминыБлюд = РезультатЗапроса.Получить(5).Выгрузить();
			ДиетическиеСтолыБлюд = РезультатЗапроса.Получить(6).Выгрузить();
			
			БлюдаМеню = РезультатЗапроса.Получить(7).Выгрузить();
			
			МассивСтрок = Новый Массив;
			Для Каждого СтрокаРезультата Из БлюдаМеню Цикл
				СтруктураСтроки = Новый Структура("dishname, amount, unit, price");
				ЗаполнитьЗначенияСвойств(СтруктураСтроки, СтрокаРезультата);
				
				СтруктураСтроки.Вставить("id", Строка(СтрокаРезультата["id"]));
				
				СтруктураСтроки.Вставить("img", Не СтрокаРезультата["Изображение"].Получить() = Неопределено);
				
				Если АллергеныБлюд.Количество() > 0 Тогда
					СтруктураСтроки.Вставить("is_allergy", Не АллергеныБлюд.Найти(СтрокаРезультата["Блюдо"]) = Неопределено);	
				КонецЕсли;
				Если ВитаминыБлюд.Количество() > 0 Тогда
					СтруктураСтроки.Вставить("has_vitamine", Не ВитаминыБлюд.Найти(СтрокаРезультата["Блюдо"]) = Неопределено);	
				КонецЕсли;
				Если ДиетическиеСтолыБлюд.Количество() > 0 Тогда
					СтруктураСтроки.Вставить("diet_compatible", Не ДиетическиеСтолыБлюд.Найти(СтрокаРезультата["Блюдо"]) = Неопределено);	
				КонецЕсли;
				
				МассивСтрок.Добавить(СтруктураСтроки);
			КонецЦикла;
		Иначе
			Запрос = Новый Запрос;
			Запрос.Текст =
			"ВЫБРАТЬ
			|	МенюБлюда.Блюдо.Наименование КАК dishname,
			|	МенюБлюда.Блюдо.Выход КАК amount,
			|	МенюБлюда.Блюдо.ЕдиницаИзмерения.Наименование КАК unit,
			|	МенюБлюда.Цена КАК price,
			|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(МенюБлюда.Блюдо) КАК id,
			|	МенюБлюда.Блюдо.Изображение КАК Изображение
			|ИЗ
			|	Документ.Меню.Блюда КАК МенюБлюда
			|ГДЕ
			|	НАЧАЛОПЕРИОДА(МенюБлюда.Ссылка.Дата, ДЕНЬ) = &Дата";
			Запрос.УстановитьПараметр("Дата", ПолучитьДату());
			
			РезультатЗапроса = Запрос.Выполнить().Выгрузить();
			
			МассивСтрок = Новый Массив;
			Для Каждого СтрокаРезультата Из РезультатЗапроса Цикл
				СтруктураСтроки = Новый Структура("dishname, amount, unit, price");
				ЗаполнитьЗначенияСвойств(СтруктураСтроки, СтрокаРезультата);
				
				СтруктураСтроки.Вставить("id", Строка(СтрокаРезультата["id"]));
				
				СтруктураСтроки.Вставить("img", Не СтрокаРезультата["Изображение"].Получить() = Неопределено);
				
				МассивСтрок.Добавить(СтруктураСтроки);
			КонецЦикла;
		Конецесли;
		
		Результат["Результат"] = МассивСтрок;
		Результат["Успех"] = Истина;
		
	Исключение
		Результат["Ошибка"] = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

Функция Авторизация(Логин, Пароль = Неопределено) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Пользователи.Токен КАК Токен,
	|	Пользователи.Пароль КАК Пароль
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.Логин = &Логин";
	Запрос.УстановитьПараметр("Логин", Логин);
	Запрос.УстановитьПараметр("Пароль", Пароль);
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	
	Если РезультатЗапроса.Количество() = 1 Тогда
		ДанныеПользователя = РезультатЗапроса.Получить(0);
		
		Результат["Успех"] = Истина;
		
		Если Не Пароль = Неопределено И Пароль = ДанныеПользователя["Пароль"] Тогда
			Результат["Результат"] = ДанныеПользователя["Токен"];
		КонецЕсли;
	Иначе
		Результат["Ошибка"] = "Авторизация не удалась. Проверьте имя пользователя и пароль.";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПроверитьАвторизацию(Токен) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Попытка
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	Пользователи.Логин КАК Логин
		|ИЗ
		|	Справочник.Пользователи КАК Пользователи
		|ГДЕ
		|	Пользователи.Токен = &Токен
		|	И НЕ Пользователи.ПометкаУдаления";
		Запрос.УстановитьПараметр("Токен", Токен);
		
		РезультатЗапроса = Запрос.Выполнить().Выгрузить();
		
		Результат["Успех"] = РезультатЗапроса.Количество() > 0;
		
		Если Результат["Успех"] Тогда
			Результат["Результат"] = РезультатЗапроса[0]["Логин"];
		Иначе
			Результат.Вставить("КодСостояния", 401);
		КонецЕсли;
	Исключение
		Результат["Ошибка"] = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Результат;	
	
КонецФункции

Функция Регистрация(Логин, Пароль) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатАвторизации = Авторизация(Логин);
	
	Если РезультатАвторизации["Успех"] Тогда
		Результат["Ошибка"] = "Пользователь уже существует.";
	Иначе
		НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
		НовыйПользователь.Пароль = Пароль;
		НовыйПользователь.Логин = Логин;
		НовыйПользователь.Токен = Строка(Новый УникальныйИдентификатор);
		
		Попытка
			НовыйПользователь.Записать();
			
			Результат["Успех"] = Истина;
			Результат["Результат"] = НовыйПользователь.Токен;
		Исключение
			Результат["Ошибка"] = ОписаниеОшибки();
		КонецПопытки;
	КонецЕсли;
	
	Возврат Результат;	
	
КонецФункции

Функция ПолучитьИнформациюБлюда(Идентификатор, Токен) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Блюдо = Справочники.Блюда.ПолучитьСсылку(Новый УникальныйИдентификатор(Идентификатор));
	
	Если ЗначениеЗаполнено(Блюдо) Тогда
		
		Пользователь = ПолучитьПользователя(Токен);
		
		Если ЗначениеЗаполнено(Пользователь) Тогда
			Запрос = Новый Запрос;
			Запрос.Текст =
			"ВЫБРАТЬ
			|	Блюда.Наименование КАК name,
			|	Блюда.Выход КАК out,
			|	Блюда.ЕдиницаИзмерения.Наименование КАК unit
			|ИЗ
			|	Справочник.Блюда КАК Блюда
			|ГДЕ
			|	Блюда.Ссылка = &Блюдо
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	СоставБлюда.Ингредиент.Наименование КАК name,
			|	СоставБлюда.ЕдиницаИзмерения.Наименование КАК unit,
			|	СоставБлюда.Количество КАК amount
			|ИЗ
			|	Справочник.Блюда.СоставБлюда КАК СоставБлюда
			|ГДЕ
			|	СоставБлюда.Ссылка = &Блюдо
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ИнгредиентыАллергены.Аллерген КАК Аллерген,
			|	ИнгредиентыАллергены.Ссылка КАК Ингредиент
			|ИЗ
			|	Справочник.Блюда.СоставБлюда КАК БлюдаСоставБлюда
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ингредиенты.Аллергены КАК ИнгредиентыАллергены
			|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи.Аллергены КАК ПользователиАллергены
			|			ПО ИнгредиентыАллергены.Аллерген = ПользователиАллергены.Аллерген
			|		ПО БлюдаСоставБлюда.Ингредиент = ИнгредиентыАллергены.Ссылка
			|ГДЕ
			|	БлюдаСоставБлюда.Ссылка = &Блюдо
			|	И ПользователиАллергены.Ссылка = &Пользователь
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ИнгредиентыВитамины.Витамин КАК Витамин,
			|	ИнгредиентыВитамины.Ссылка КАК Ингредиент
			|ИЗ
			|	Справочник.Блюда.СоставБлюда КАК БлюдаСоставБлюда
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ингредиенты.Витамины КАК ИнгредиентыВитамины
			|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи.Витамины КАК ПользователиВитамины
			|			ПО ИнгредиентыВитамины.Витамин = ПользователиВитамины.Витамин
			|		ПО БлюдаСоставБлюда.Ингредиент = ИнгредиентыВитамины.Ссылка
			|ГДЕ
			|	БлюдаСоставБлюда.Ссылка = &Блюдо
			|	И ПользователиВитамины.Ссылка = &Пользователь
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	БлюдаДиетическиеСтолы.ДиетическийСтол КАК ДиетическийСтол
			|ИЗ
			|	Справочник.Блюда.ДиетическиеСтолы КАК БлюдаДиетическиеСтолы
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи.ДиетическиеСтолы КАК ПользователиДиетическиеСтолы
			|		ПО БлюдаДиетическиеСтолы.ДиетическийСтол = ПользователиДиетическиеСтолы.ДиетическийСтол
			|ГДЕ
			|	БлюдаДиетическиеСтолы.Ссылка = &Блюдо
			|	И ПользователиДиетическиеСтолы.Ссылка = &Пользователь";
			Запрос.УстановитьПараметр("Пользователь", Пользователь);
			Запрос.УстановитьПараметр("Блюдо", Блюдо);
			
			РезультатЗапроса = Запрос.ВыполнитьПакет();
			
			ДанныеБлюда = РезультатЗапроса.Получить(0).Выгрузить();
			ДанныеСоставаБлюда = РезультатЗапроса.Получить(1).Выгрузить();
			
			АллергеныПользователяВБлюде = РезультатЗапроса.Получить(2).Выгрузить();
			ВитаминыПользователяВБлюде = РезультатЗапроса.Получить(3).Выгрузить();
			ДиетическиеСтолыПользователяБлюда = РезультатЗапроса.Получить(4).Выгрузить();
			
			Если ДанныеБлюда.Количество() = 1 Тогда
				СтрокаДанныхБлюда = ДанныеБлюда.Получить(0);
				
				СтруктураДанныхБлюда = Новый Структура;
				Для Каждого Колонка Из ДанныеБлюда.Колонки Цикл
					СтруктураДанныхБлюда.Вставить(Колонка.Имя, СтрокаДанныхБлюда[Колонка.Имя]);
				КонецЦикла;
				
				Если АллергеныПользователяВБлюде.Количество() > 0 Тогда
					МассивСтрокПредупреждений = Новый Массив;
					
					Для Каждого СтрокаАллергена Из АллергеныПользователяВБлюде Цикл
						МассивСтрокПредупреждений.Добавить(СтрШаблон("В ингредиенте ""%1"" содержится аллерген ""%2"".", СтрокаАллергена["Ингредиент"], СтрокаАллергена["Аллерген"]));
					КонецЦикла;
					
					МассивСтрокПредупреждений.Добавить("Употребление блюда противопоказано!!!");
					
					СтруктураДанныхБлюда.Вставить("is_allergy", СтрСоединить(МассивСтрокПредупреждений, Символы.ПС));
				КонецЕсли;
				
				Если ВитаминыПользователяВБлюде.Количество() > 0 Тогда
					МассивСтрокРекомендаций = Новый Массив;
					
					Для Каждого СтрокаВитамина Из ВитаминыПользователяВБлюде Цикл
						МассивСтрокРекомендаций.Добавить(СтрШаблон("В ингредиенте ""%1"" содержится рекомендуемый Вам витамин ""%2""", СтрокаВитамина["Ингредиент"], СтрокаВитамина["Витамин"]));
					КонецЦикла;
					
					СтруктураДанныхБлюда.Вставить("has_vitamine", СтрСоединить(МассивСтрокРекомендаций, Символы.ПС));
				КонецЕсли;
				
				Если ДиетическиеСтолыПользователяБлюда.Количество() > 0 Тогда
					МассивСтрокДиет = Новый Массив;
					
					Для Каждого СтрокаВитамина Из ДиетическиеСтолыПользователяБлюда Цикл
						МассивСтрокДиет.Добавить(СтрШаблон("Подходит под Ваш диетический стол (%1)", СтрокаВитамина["ДиетическийСтол"]));
					КонецЦикла;
					
					СтруктураДанныхБлюда.Вставить("diet_compatible", СтрСоединить(МассивСтрокДиет, Символы.ПС));
				КонецЕсли;
				
				МассивДанныхСостава = Новый Массив;
				Для Каждого СтрокаСостава Из ДанныеСоставаБлюда Цикл
					СтруктураДанныхСостава = Новый Структура("name, unit, amount");
					ЗаполнитьЗначенияСвойств(СтруктураДанныхСостава, СтрокаСостава);
					
					МассивДанныхСостава.Добавить(СтруктураДанныхСостава);
				КонецЦикла;
				
				СтруктураДанныхБлюда.Вставить("consist", МассивДанныхСостава);
				
				Результат["Успех"] = Истина;
				Результат["Результат"] = СтруктураДанныхБлюда;
			Иначе
				Результат["Ошибка"] = "Данные отсутствуют";
			КонецЕсли;
		Иначе
			Запрос = Новый Запрос;
			Запрос.Текст =
			"ВЫБРАТЬ
			|	Блюда.Наименование КАК name,
			|	Блюда.Выход КАК out,
			|	Блюда.ЕдиницаИзмерения.Наименование КАК unit
			|ИЗ
			|	Справочник.Блюда КАК Блюда
			|ГДЕ
			|	Блюда.Ссылка = &Блюдо
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	СоставБлюда.Ингредиент.Наименование КАК name,
			|	СоставБлюда.ЕдиницаИзмерения.Наименование КАК unit,
			|	СоставБлюда.Количество КАК amount
			|ИЗ
			|	Справочник.Блюда.СоставБлюда КАК СоставБлюда
			|ГДЕ
			|	СоставБлюда.Ссылка = &Блюдо";
			Запрос.УстановитьПараметр("Блюдо", Блюдо);
			
			РезультатЗапроса = Запрос.ВыполнитьПакет();
			
			ДанныеБлюда = РезультатЗапроса.Получить(0).Выгрузить();
			ДанныеСоставаБлюда = РезультатЗапроса.Получить(1).Выгрузить();
			
			Если ДанныеБлюда.Количество() = 1 Тогда
				СтрокаДанныхБлюда = ДанныеБлюда.Получить(0);
				
				СтруктураДанныхБлюда = Новый Структура;
				Для Каждого Колонка Из ДанныеБлюда.Колонки Цикл
					СтруктураДанныхБлюда.Вставить(Колонка.Имя, СтрокаДанныхБлюда[Колонка.Имя]);
				КонецЦикла;
				
				МассивДанныхСостава = Новый Массив;
				Для Каждого СтрокаСостава Из ДанныеСоставаБлюда Цикл
					СтруктураДанныхСостава = Новый Структура("name, unit, amount");
					ЗаполнитьЗначенияСвойств(СтруктураДанныхСостава, СтрокаСостава);
					
					МассивДанныхСостава.Добавить(СтруктураДанныхСостава);
				КонецЦикла;
				
				СтруктураДанныхБлюда.Вставить("consist", МассивДанныхСостава);
				
				Результат["Успех"] = Истина;
				Результат["Результат"] = СтруктураДанныхБлюда;
			Иначе
				Результат["Ошибка"] = "Данные отсутствуют";
			КонецЕсли;
		КонецЕсли;
	Иначе
		Результат["Ошибка"] = "Блюдо не найдено";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьСоставКорзины(Токен) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Пользователь = ПолучитьПользователя(Токен);
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	КорзиныПользователей.Блюдо.Наименование КАК dishname,
	|	КорзиныПользователей.Количество КАК count,
	|	КорзиныПользователей.Блюдо.ЕдиницаИзмерения.Наименование КАК unit,
	|	КорзиныПользователей.Цена КАК price,
	|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(КорзиныПользователей.Блюдо) КАК id,
	|	КорзиныПользователей.Блюдо.Изображение КАК Изображение
	|ИЗ
	|	РегистрСведений.КорзиныПользователей КАК КорзиныПользователей
	|ГДЕ
	|	КорзиныПользователей.Пользователь = &Пользователь
	|	И КорзиныПользователей.Дата = &Дата
	|
	|УПОРЯДОЧИТЬ ПО
	|	КорзиныПользователей.Порядок
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ЗаказПользователя.Ссылка) КАК id
	|ИЗ
	|	Документ.ЗаказПользователя КАК ЗаказПользователя
	|ГДЕ
	|	ЗаказПользователя.Пользователь = &Пользователь
	|	И ЗаказПользователя.Дата = &Дата";
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Дата", ПолучитьДату());
	
	РезультатЗапроса = Запрос.ВыполнитьПакет();
	
	СоставКорзины = РезультатЗапроса.Получить(0).Выгрузить();
	
	МассивСтрок = Новый Массив;
	Для Каждого СтрокаРезультата Из СоставКорзины Цикл
		СтруктураСтроки = Новый Структура("dishname, count, unit, price, id");
		ЗаполнитьЗначенияСвойств(СтруктураСтроки, СтрокаРезультата);
		
		СтруктураСтроки.Вставить("id", Строка(СтрокаРезультата["id"]));
		
		СтруктураСтроки.Вставить("img", Не СтрокаРезультата["Изображение"].Получить() = Неопределено);
		
		МассивСтрок.Добавить(СтруктураСтроки);
	КонецЦикла;
	
	ИдентификаторЗаказа = Неопределено;
	ТаблицаИдентификатораЗаказа = РезультатЗапроса.Получить(1).Выгрузить();
	Если ТаблицаИдентификатораЗаказа.Количество() = 1 Тогда
		ИдентификаторЗаказа = Строка(ТаблицаИдентификатораЗаказа.Получить(0)["id"]);
	КонецЕсли;
	
	Результат["Успех"] = Истина;
	Результат["Результат"] = Новый Структура("id, dishes", ИдентификаторЗаказа, МассивСтрок);;
	
	Возврат Результат;
	
КонецФункции

Функция ЗаписатьСоставКорзины(Токен, Состав) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	ТранзакцияВерхнегоУровня = Не ТранзакцияАктивна();
	
	Если ТранзакцияВерхнегоУровня Тогда
		НачатьТранзакцию();
	КонецЕсли;
	
	Попытка
		Пользователь = ПолучитьПользователя(Токен);
		Дата = ПолучитьДату(); // ровно на полночь завтрашнего дня
		
		// шаг 1 - берем цены из сегодняшнего меню
		// шаг 2 - получаем даты предыдущих корзин и удаляем записи
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	МенюБлюда.Блюдо КАК Блюдо,
		|	МенюБлюда.Цена КАК Цена
		|ИЗ
		|	Документ.Меню.Блюда КАК МенюБлюда
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	КорзиныПользователей.Дата КАК Дата
		|ИЗ
		|	РегистрСведений.КорзиныПользователей КАК КорзиныПользователей
		|ГДЕ
		|	КорзиныПользователей.Пользователь = &Пользователь";
		Запрос.УстановитьПараметр("Пользователь", Пользователь);
		
		РезультатЗапроса = Запрос.ВыполнитьПакет();
		
		ТаблицаЦен = РезультатЗапроса.Получить(0).Выгрузить();
		
		// запомнили цены блюд
		ЦеныБлюд = Новый Соответствие;
		Для Каждого СтрокаЦен Из ТаблицаЦен Цикл
			ЦеныБлюд.Вставить(СтрокаЦен["Блюдо"], СтрокаЦен["Цена"]);
		КонецЦикла;
		
		// чистим корзины
		ТаблицаУстаревшихКорзин = РезультатЗапроса.Получить(1).Выгрузить();
		Для Каждого СтрокаДатыКорзины Из ТаблицаУстаревшихКорзин Цикл
			НаборЗаписей = РегистрыСведений.КорзиныПользователей.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор["Дата"].Установить(Дата);
			НаборЗаписей.Записать(Истина);
		КонецЦикла;
		
		// шаг 3 - сохраняем данные новой корзины
		Порядок = 1;
		Для Каждого ЭлементСостава Из Состав Цикл
			Блюдо = Справочники.Блюда.ПолучитьСсылку(Новый УникальныйИдентификатор(ЭлементСостава["id"]));
			
			Если Не ЗначениеЗаполнено(Блюдо) Тогда
				ВызватьИсключение СтрШаблон("Не найдено блюдо с идентификатором %1", ЭлементСостава["id"]);
			КонецЕсли;	
			
			Запись = РегистрыСведений.КорзиныПользователей.СоздатьМенеджерЗаписи();
			Запись.Пользователь = Пользователь;
			Запись.Дата = Дата;
			Запись.Блюдо = Блюдо;
			Запись.Количество = ЭлементСостава["count"];
			Запись.Цена = ЦеныБлюд[Блюдо];
			Запись.Порядок = Порядок;
			
			Запись.Записать(Истина);
			
			Порядок = Порядок + 1;
		КонецЦикла;
		
		Результат["Успех"] = Истина;
		
		Если ТранзакцияВерхнегоУровня Тогда
			ЗафиксироватьТранзакцию();
		КонецЕсли;
	Исключение
		Если ТранзакцияВерхнегоУровня Тогда
			ОтменитьТранзакцию();
		КонецЕсли;
		
		ТекстОшибки = ОписаниеОшибки();
		
		Если ТранзакцияВерхнегоУровня Тогда
			Результат["Ошибка"] = ТекстОшибки;
		Иначе
			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьИзображение(ИдентификаторБлюда) Экспорт
	
	Результат = Неопределено;
	
	Если ЗначениеЗаполнено(ИдентификаторБлюда) Тогда
		Блюдо = Справочники.Блюда.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторБлюда));
		
		Если ЗначениеЗаполнено(Блюдо) Тогда
			Результат = Блюдо.Изображение.Получить();
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьДанныеЗаказа(Токен, ИдентификаторЗаказа) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Попытка
		ЗаказПользователя = Документы.ЗаказПользователя.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторЗаказа));
		
		Если ЗначениеЗаполнено(ЗаказПользователя) Тогда
			Запрос = Новый Запрос;
			Запрос.Текст =
			"ВЫБРАТЬ
			|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ЗаказПользователя.Ссылка) КАК id,
			|	ЗаказПользователя.Дата КАК date,
			|	СУММА(ЗаказПользователяБлюда.Количество * МенюБлюда.Цена) КАК sum,
			|	ЗаказПользователя.Дата = &Дата КАК is_editable
			|ИЗ
			|	Документ.ЗаказПользователя КАК ЗаказПользователя
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПользователя.Блюда КАК ЗаказПользователяБлюда
			|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Меню.Блюда КАК МенюБлюда
			|			ПО ЗаказПользователяБлюда.Ссылка.Меню = МенюБлюда.Ссылка
			|				И ЗаказПользователяБлюда.Блюдо = МенюБлюда.Блюдо
			|		ПО ЗаказПользователя.Ссылка = ЗаказПользователяБлюда.Ссылка
			|ГДЕ
			|	ЗаказПользователя.Ссылка = &ЗаказПользователя
			|
			|СГРУППИРОВАТЬ ПО
			|	ЗаказПользователя.Дата,
			|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ЗаказПользователя.Ссылка)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ЗаказПользователяБлюда.Блюдо.Наименование КАК dishname,
			|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ЗаказПользователяБлюда.Блюдо) КАК id,
			|	ЗаказПользователяБлюда.Количество КАК count,
			|	ЗаказПользователяБлюда.Блюдо.ЕдиницаИзмерения.Наименование КАК unit,
			|	МенюБлюда.Цена КАК price,
			|	ЗаказПользователяБлюда.Блюдо.Изображение КАК Изображение
			|ИЗ
			|	Документ.ЗаказПользователя.Блюда КАК ЗаказПользователяБлюда
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Меню.Блюда КАК МенюБлюда
			|		ПО ЗаказПользователяБлюда.Ссылка.Меню = МенюБлюда.Ссылка
			|			И ЗаказПользователяБлюда.Блюдо = МенюБлюда.Блюдо
			|ГДЕ
			|	ЗаказПользователяБлюда.Ссылка = &ЗаказПользователя";
			Запрос.УстановитьПараметр("Дата", ПолучитьДату());
			Запрос.УстановитьПараметр("ЗаказПользователя", ЗаказПользователя);
			
			РезультатЗапроса = Запрос.ВыполнитьПакет();
			
			ТаблицаШапки = РезультатЗапроса.Получить(0).Выгрузить();
			
			Если ТаблицаШапки.Количество() = 0 Тогда
				Результат["Ошибка"] = "Нет данных!";
			Иначе
				СтрокаШапки = ТаблицаШапки.Получить(0);
				
				СтруктураДокумента = Новый Структура("sum, is_editable");
				ЗаполнитьЗначенияСвойств(СтруктураДокумента, СтрокаШапки);
				
				СтруктураДокумента.Вставить("id", Строка(СтрокаШапки["id"]));
				СтруктураДокумента.Вставить("date", ЗаписатьДатуJSON(СтрокаШапки["date"], ФорматДатыJSON.ISO));
				
				ТаблицаСостава = РезультатЗапроса.Получить(1).Выгрузить();
				
				МассивСтрок = Новый Массив;
				Для Каждого СтрокаРезультата Из ТаблицаСостава Цикл
					СтруктураСтроки = Новый Структура("dishname, count, unit, price, id");
					ЗаполнитьЗначенияСвойств(СтруктураСтроки, СтрокаРезультата);
					
					СтруктураСтроки.Вставить("id", Строка(СтрокаРезультата["id"]));
					
					СтруктураСтроки.Вставить("img", Не СтрокаРезультата["Изображение"].Получить() = Неопределено);
					
					МассивСтрок.Добавить(СтруктураСтроки);
				КонецЦикла;
				
				СтруктураДокумента.Вставить("dishes", МассивСтрок);
				
				Результат["Успех"] = Истина;
				Результат["Результат"] = СтруктураДокумента;
			КонецЕсли;
		Иначе
			Результат["Ошибка"] = "Заказ не найден";
			Результат.Вставить("КодСостояния", 404);
		КонецЕсли;
		
	Исключение
		Результат["Ошибка"] = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

Функция ЗапистьДанныеЗаказа(Токен) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	ТранзакцияВерхнегоУровня = Не ТранзакцияАктивна();
	
	Если ТранзакцияВерхнегоУровня Тогда
		НачатьТранзакцию();
	КонецЕсли;
	
	Попытка
		
		Пользователь = ПолучитьПользователя(Токен);
		
		Если ЗначениеЗаполнено(Пользователь) Тогда
			РезультатПолученияСоставаКорзины = ПолучитьСоставКорзиныДляЗаказа(Пользователь);
			
			Если РезультатПолученияСоставаКорзины["Успех"] Тогда
				СоставКорзины = РезультатПолученияСоставаКорзины["Результат"];
				
				// шаг 1 - создаем заказ
				
				ТекущийЗаказ = ПолучитьЗаказПользователя(Пользователь);
				
				Если ТекущийЗаказ = Неопределено Тогда
					ТекущийЗаказОбъект = Документы.ЗаказПользователя.СоздатьДокумент();
					ТекущийЗаказОбъект.Дата = ПолучитьДату();
					ТекущийЗаказОбъект.Пользователь = Пользователь;
					ТекущийЗаказОбъект.Меню = ПолучитьАктуальноеМеню();
				Иначе
					ТекущийЗаказОбъект = ТекущийЗаказ.ПолучитьОбъект();
				КонецЕсли;
				
				ТекущийЗаказОбъект.Блюда.Очистить();
				ТекущийЗаказОбъект.Блюда.Загрузить(СоставКорзины);
				
				ТекущийЗаказОбъект.Записать(РежимЗаписиДокумента.Запись);
				
				// шаг 2 - очищаем корзину
				НаборЗаписей = РегистрыСведений.КорзиныПользователей.СоздатьНаборЗаписей();
				НаборЗаписей.Отбор["Дата"].Установить(ПолучитьДату());
				НаборЗаписей.Записать(Истина);
				
				Результат["Успех"] = Истина;
				Результат["Результат"] = Строка(ТекущийЗаказОбъект.Ссылка.УникальныйИдентификатор());
				
			Иначе
				Результат["Ошибка"] = РезультатПолученияСоставаКорзины["Ошибка"];
			КонецЕсли;
			
		КонецЕсли;
		
		Результат["Успех"] = Истина;
		
		Если ТранзакцияВерхнегоУровня Тогда
			ЗафиксироватьТранзакцию();
		КонецЕсли;
	Исключение
		Если ТранзакцияВерхнегоУровня Тогда
			ОтменитьТранзакцию();
		КонецЕсли;
		
		ТекстОшибки = ОписаниеОшибки();
		
		Если ТранзакцияВерхнегоУровня Тогда
			Результат["Ошибка"] = ТекстОшибки;
		Иначе
			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьСписокПоследнихЗаказов(Токен) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ЗаказПользователяБлюда.Ссылка.Дата КАК date,
	|	СУММА(МенюБлюда.Цена * ЗаказПользователяБлюда.Количество) КАК sum,
	|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ЗаказПользователяБлюда.Ссылка) КАК id,
	|	ЗаказПользователяБлюда.Ссылка.Дата = &ДатаОкончания КАК is_editable
	|ИЗ
	|	Документ.ЗаказПользователя.Блюда КАК ЗаказПользователяБлюда
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Меню.Блюда КАК МенюБлюда
	|		ПО ЗаказПользователяБлюда.Ссылка.Меню = МенюБлюда.Ссылка
	|			И ЗаказПользователяБлюда.Блюдо = МенюБлюда.Блюдо
	|ГДЕ
	|	ЗаказПользователяБлюда.Ссылка.Дата >= ДОБАВИТЬКДАТЕ(&ДатаОкончания, ДЕНЬ, -30)
	|	И ЗаказПользователяБлюда.Ссылка.Дата <= &ДатаОкончания
	|	И ЗаказПользователяБлюда.Ссылка.Пользователь = &Пользователь
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗаказПользователяБлюда.Ссылка.Дата,
	|	ЗаказПользователяБлюда.Ссылка.Дата = &ДатаОкончания,
	|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ЗаказПользователяБлюда.Ссылка)";
	Запрос.УстановитьПараметр("Пользователь", ПолучитьПользователя(Токен));
	Запрос.УстановитьПараметр("ДатаОкончания", ПолучитьДату());
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	
	МассивЗаказов = Новый Массив;
	Для Каждого СтрокаРезультата Из РезультатЗапроса Цикл
		СтруктураЗаказа = Новый Структура("sum, is_editable");
		ЗаполнитьЗначенияСвойств(СтруктураЗаказа, СтрокаРезультата);
		
		СтруктураЗаказа.Вставить("id", Строка(СтрокаРезультата["id"]));
		
		СтруктураЗаказа.Вставить("date", ЗаписатьДатуJSON(СтрокаРезультата["date"], ФорматДатыJSON.ISO));
		
		МассивЗаказов.Добавить(СтруктураЗаказа);
	КонецЦикла;
	
	Результат["Успех"] = Истина;
	Результат["Результат"] = МассивЗаказов;
	
	Возврат Результат;
	
КонецФункции

Функция РедактироватьДанныеЗаказа(Токен, ИдентификаторЗаказа) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПолученияДанныхЗаказа = ПолучитьДанныеЗаказа(Токен, ИдентификаторЗаказа);
	
	Если РезультатПолученияДанныхЗаказа["Успех"] Тогда
		РезультатПереносаЗаказаВКорзину = ЗаписатьСоставКорзины(Токен, РезультатПолученияДанныхЗаказа["Результат"]["dishes"]);
		Если РезультатПереносаЗаказаВКорзину["Успех"] Тогда
			Результат = ПолучитьСоставКорзины(Токен);
		Иначе
			Результат["Ошибка"] = РезультатПереносаЗаказаВКорзину["Ошибка"];
		КонецЕсли;
	Иначе
		Результат["Ошибка"] = РезультатПолученияДанныхЗаказа["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция СериализоватьМедицину(РезультатЗапроса, ПолучатьАллергены = Истина, ПолучатьВитамины = Истина, ПолучатьДиетическиеСтолы = Истина)

	ТаблицаАллергенов = РезультатЗапроса.Получить(0).Выгрузить();
	ТаблицаВитаминов = РезультатЗапроса.Получить(1).Выгрузить();
	ТаблицаДиетическихСтолов = РезультатЗапроса.Получить(2).Выгрузить();
	
	СтруктураОтвета = Новый Структура;
	
	Если ПолучатьАллергены Тогда
		МассивАллергенов = Новый Массив;
		Если ТаблицаАллергенов.Количество() > 0 Тогда
			Для Каждого СтрокаТаблицы Из ТаблицаАллергенов Цикл
				СтруктураАллергена = Новый Структура;
				СтруктураАллергена.Вставить("name", СтрокаТаблицы["name"]);
				СтруктураАллергена.Вставить("id", Строка(СтрокаТаблицы["id"]));
				
				МассивАллергенов.Добавить(СтруктураАллергена);
			КонецЦикла;
		КонецЕсли;
		СтруктураОтвета.Вставить("allergens", МассивАллергенов);
	КонецЕсли;
	
	Если ПолучатьВитамины Тогда
		МассивВитаминов = Новый Массив;
		Если ТаблицаВитаминов.Количество() > 0 Тогда
			Для Каждого СтрокаТаблицы Из ТаблицаВитаминов Цикл
				СтруктураВитамина = Новый Структура;
				СтруктураВитамина.Вставить("name", СтрокаТаблицы["name"]);
				СтруктураВитамина.Вставить("id", Строка(СтрокаТаблицы["id"]));
				
				МассивВитаминов.Добавить(СтруктураВитамина);
			КонецЦикла;
		КонецЕсли;
		СтруктураОтвета.Вставить("vitamins", МассивВитаминов);
	КонецЕсли;
	
	Если ПолучатьДиетическиеСтолы Тогда
		МассивДиетическихСтолов = Новый Массив;
		Если ТаблицаДиетическихСтолов.Количество() > 0 Тогда
			Для Каждого СтрокаТаблицы Из ТаблицаДиетическихСтолов Цикл
				СтруктураДиетическогоСтола = Новый Структура;
				СтруктураДиетическогоСтола.Вставить("name", СтрокаТаблицы["name"]);
				СтруктураДиетическогоСтола.Вставить("id", Строка(СтрокаТаблицы["id"]));
				
				МассивДиетическихСтолов.Добавить(СтруктураДиетическогоСтола);
			КонецЦикла;
		КонецЕсли;
		СтруктураОтвета.Вставить("diet_tables", МассивДиетическихСтолов);
	КонецЕсли;	
	
	Возврат СтруктураОтвета;
	
КонецФункции

Функция ПолучитьНаборМедицинскихСведений(Типы) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Попытка
		ПолучатьАллергены = (Не Типы.Найти("allergens") = Неопределено);
		ПолучатьВитамины = (Не Типы.Найти("vitamins") = Неопределено);
		ПолучатьДиетическиеСтолы = (Не Типы.Найти("diet_tables") = Неопределено);
		
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	Аллергены.Наименование КАК name,
		|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Аллергены.Ссылка) КАК id
		|ИЗ
		|	Справочник.Аллергены КАК Аллергены
		|ГДЕ
		|	НЕ Аллергены.ПометкаУдаления
		|	И &ПолучатьАллергены
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Витамины.Наименование КАК name,
		|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Витамины.Ссылка) КАК id
		|ИЗ
		|	Справочник.Витамины КАК Витамины
		|ГДЕ
		|	НЕ Витамины.ПометкаУдаления
		|	И &ПолучатьВитамины
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ДиетическиеСтолы.Наименование КАК name,
		|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ДиетическиеСтолы.Ссылка) КАК id
		|ИЗ
		|	Справочник.ДиетическиеСтолы КАК ДиетическиеСтолы
		|ГДЕ
		|	НЕ ДиетическиеСтолы.ПометкаУдаления
		|	И &ПолучатьДиетическиеСтолы";
		Запрос.УстановитьПараметр("ПолучатьАллергены", ПолучатьАллергены);
		Запрос.УстановитьПараметр("ПолучатьВитамины", ПолучатьВитамины);
		Запрос.УстановитьПараметр("ПолучатьДиетическиеСтолы", ПолучатьДиетическиеСтолы);
		
		РезультатЗапроса = Запрос.ВыполнитьПакет();
		
		СтруктураОтвета = СериализоватьМедицину(РезультатЗапроса, ПолучатьАллергены, ПолучатьВитамины, ПолучатьДиетическиеСтолы);
		
		Результат["Успех"] = Истина;
		Результат["Результат"] = СтруктураОтвета;
	Исключение
		Результат["Ошибка"] = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

Функция ПрочитатьМедицинуПользователя(Токен) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Попытка
		Пользователь = ПолучитьПользователя(Токен);
		
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	ПользователиАллергены.Аллерген.Наименование КАК name,
		|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ПользователиАллергены.Аллерген) КАК id
		|ИЗ
		|	Справочник.Пользователи.Аллергены КАК ПользователиАллергены
		|ГДЕ
		|	ПользователиАллергены.Ссылка = &Пользователь
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ПользователиВитамины.Витамин.Наименование КАК name,
		|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ПользователиВитамины.Витамин) КАК id
		|ИЗ
		|	Справочник.Пользователи.Витамины КАК ПользователиВитамины
		|ГДЕ
		|	ПользователиВитамины.Ссылка = &Пользователь
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ПользователиДиетическиеСтолы.ДиетическийСтол.Наименование КАК name,
		|	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ПользователиДиетическиеСтолы.ДиетическийСтол) КАК id
		|ИЗ
		|	Справочник.Пользователи.ДиетическиеСтолы КАК ПользователиДиетическиеСтолы
		|ГДЕ
		|	ПользователиДиетическиеСтолы.Ссылка = &Пользователь";
		Запрос.УстановитьПараметр("Пользователь", Пользователь);
		
		РезультатЗапроса = Запрос.ВыполнитьПакет();
		
		СтруктураОтвета = СериализоватьМедицину(РезультатЗапроса);
		
		Результат["Результат"] = СтруктураОтвета;
		Результат["Успех"] = Истина;
	Исключение
		Результат["Ошибка"] = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

Функция ЗаписатьМедицинуПользователя(Токен, Медицина) Экспорт
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Попытка
		Пользователь = ПолучитьПользователя(Токен);
		
		ПользовательОбъект = Пользователь.ПолучитьОбъект();
		
		#Если Сервер И Не Сервер Тогда
			ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
		#КонецЕсли
		
		НужнаЗапись = Ложь;
		
		Аллергены = Медицина["allergens"];
		
		Если Не Аллергены = Неопределено Тогда
			ПользовательОбъект.Аллергены.Очистить();
			
			Для Каждого Элемент Из Аллергены Цикл
				ПользовательОбъект.Аллергены.Добавить().Аллерген = Справочники.Аллергены.ПолучитьСсылку(Новый УникальныйИдентификатор(Элемент));
			КонецЦикла;
			
			НужнаЗапись = Истина;
		КонецЕсли;
		
		Витамины = Медицина["vitamins"];
		
		Если Не Витамины = Неопределено Тогда
			ПользовательОбъект.Витамины.Очистить();
			
			Для Каждого Элемент Из Витамины Цикл
				ПользовательОбъект.Витамины.Добавить().Витамин = Справочники.Витамины.ПолучитьСсылку(Новый УникальныйИдентификатор(Элемент));
			КонецЦикла;
			
			НужнаЗапись = Истина;
		КонецЕсли;
		
		ДиетическиеСтолы = Медицина["diet_tables"];
		
		Если Не ДиетическиеСтолы = Неопределено Тогда
			ПользовательОбъект.ДиетическиеСтолы.Очистить();
			
			Для Каждого Элемент Из ДиетическиеСтолы Цикл
				ПользовательОбъект.ДиетическиеСтолы.Добавить().ДиетическийСтол = Справочники.ДиетическиеСтолы.ПолучитьСсылку(Новый УникальныйИдентификатор(Элемент));
			КонецЦикла;
			
			НужнаЗапись = Истина;
		КонецЕсли;
		
		Если НужнаЗапись Тогда
			ПользовательОбъект.Записать();
		КонецЕсли;
		
		Результат["Успех"] = Истина;
	Исключение
		Результат["Ошибка"] = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции